package com.pumpkin.jschsftpdemo.util;

import com.jcraft.jsch.*;

import java.io.*;

/**
 * 文件上传工具类
 */

public class SFTPUtils {

    Session session = null;
    Channel channel = null;

    public ChannelSftp getChannelSftp() throws JSchException {
        //ssh的服务器ip、用户名、密码和端口
        String sftpHost = "47.93.247.196";
        String sftpUsername = "root";
        String sftpPassword = "Guoxinyuan1121.";
        int sftpPort = 22;

        //创建jsch对象
        JSch jsch = new JSch();
        //获取session对象
        session = jsch.getSession(sftpUsername,sftpHost,sftpPort);
        //设置sftp访问密码
        session.setPassword(sftpPassword);

        //设置第一次登录的时候提示，可选值：{ask | yes | no}
        session.setConfig("StrictHostKeyChecking","no");

        //设置超时时间
        session.setTimeout(30000);
        //建立连接
        session.connect();
        //打开sftp通道
        channel = session.openChannel("sftp");
        //建立sftp通道连接
        channel.connect();

        return (ChannelSftp) channel;

    }

    public static void main(String[] args) {
        /**
         *          JSch支持三种文件传输模式：
         *          OVERWRITE 完全覆盖模式，这是JSch的 默认文件传输模式，即如果目标文件已经存在，传输的文件将完全覆盖目标文件，产生新的文件。
         *          RESUME 恢复模式，如果文件已经传输一部分，这时由于网络或其他任何原因导致文件传输中断，如果下一次传输相同的文件，则会从上一次中断的地方续传。
         *          APPEND 追加模式，如果目标文件已存在，传输的文件将在目标文件后追加。
         */
        String srcFile = "D:\\new05.jpeg";
        String destFile = "/home/liuning/picture.jpeg";

        try {
            SFTPUtils sftpUtils = new SFTPUtils();
            ChannelSftp channel = sftpUtils.getChannelSftp();

            //默认使用OVERWRITE模式
            OutputStream out = channel.put(destFile, ChannelSftp.OVERWRITE);
            byte[] buff = new byte[1024 * 256];
            int read;
            if (out != null) {
                System.out.println("开始读取 inputStream");
                InputStream is = new FileInputStream(srcFile);
                do {
                    read = is.read(buff,0,buff.length);
                    if (read > 0) {
                        out.write(buff,0,read);
                    }
                    out.flush();
                } while (read >= 0);
            }
            System.out.println("传输完成");
            channel.quit();
            sftpUtils.closeChannel();
        } catch (JSchException | SftpException | IOException e) {
            e.printStackTrace();
        }

    }

    public void closeChannel() {
        if (channel != null) {
            channel.disconnect();
        }
        if (session != null) {
            session.disconnect();
        }
        System.out.println("关闭通道");
    }
}
